package br.folhapagamento.dado;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.folhapagamento.to.FuncionarioTO;

public class DAOFuncionario implements IDAOFuncionario {
	
	private static final String stmntCadastrarFuncionario = "INSERT INTO funcionario "
			+ "(matricula, nome, codcargo, dataadmissao, vrGastoValeTransporte, " +
			"opCestaBasica, numDependentes) VALUES ( ?, ?, ?, ?, ?, ?, ?) ";
	
	private static final String stmntAlterarFuncionario = "UPDATE funcionario "
			+ "SET matricula=?, nome=?, codcargo=?, dataadmissao=?, " +
			" vrGastoValeTransporte=?, opCestaBasica=?, numDependentes=?" +
			" WHERE codigo=? ";
	
	private static final String stmtExcluirFuncionario = "DELETE FROM funcionario WHERE "
			+ "matricula = ? ";
	
	private static final String stmtConsultarFuncionarioPorMatricula = "SELECT * FROM funcionario WHERE "
			+ "matricula = ? ";
	
	private static final String stmtConsultarFuncionarioPorCargo = "SELECT * FROM funcionario WHERE "
			+ "codcargo = ? ";
	
	private static final String stmtConsultarFuncionarioPorDescricao = "SELECT * FROM funcionario WHERE "
			+ "nome = ? ";

	private static final String stmtListarFuncionario = "SELECT * FROM funcionario order by nome";
	
	String msg = "";

	@Override
	public ArrayList<FuncionarioTO> consultar(String nome) {
		ResultSet rs = null;
		PreparedStatement stmt;
		ArrayList<FuncionarioTO> listaFuncionarios = null;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmtConsultarFuncionarioPorDescricao);
			stmt.setString(1, nome);
			rs = stmt.executeQuery();
			listaFuncionarios = converterParaTO(rs);
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaFuncionarios;
	}
	
	public ArrayList<FuncionarioTO> listar() {
		ResultSet rs = null;
		PreparedStatement stmt;
		ArrayList<FuncionarioTO> listaFuncionarios = null;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmtListarFuncionario);
			rs = stmt.executeQuery();
			listaFuncionarios = converterParaTO(rs);
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaFuncionarios;
	}
	
	@Override
	public FuncionarioTO detalhar(int matricula) {
		ResultSet rs = null;
		PreparedStatement stmt;
		ArrayList<FuncionarioTO> listaFuncionarios = null;
		FuncionarioTO fto = null;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmtConsultarFuncionarioPorMatricula);
			stmt.setInt(1, matricula);
			rs = stmt.executeQuery();
			listaFuncionarios = converterParaTO(rs);
			stmt.close();
			fto = listaFuncionarios.get(0); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fto;
	}

	@Override
	public ArrayList<FuncionarioTO> consultar(int codCargo) {
		ResultSet rs = null;
		PreparedStatement stmt;
		ArrayList<FuncionarioTO> listaFuncionarios = null;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmtConsultarFuncionarioPorCargo);
			stmt.setInt(1, codCargo);
			rs = stmt.executeQuery();
			listaFuncionarios = converterParaTO(rs);
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaFuncionarios;
	}

	private ArrayList<FuncionarioTO> converterParaTO(ResultSet rs) throws SQLException{
		ArrayList<FuncionarioTO> listaCargos = new ArrayList<FuncionarioTO>();
		while(rs.next()){
			listaCargos.add(new FuncionarioTO(rs.getInt("matricula"), 
										rs.getString("nome"), 
										rs.getInt("codcargo"),
										rs.getDate("dataadmissao"),
										rs.getBigDecimal("vrGastoValeTransporte"),
										rs.getBoolean("opCestaBasica"),
										rs.getInt("numDependentes")));
		}
		return listaCargos;
	}
	
	@Override
	public int cadastrar(FuncionarioTO funcionario) {
		PreparedStatement stmt;
		int rc = 0;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmntCadastrarFuncionario);
			stmt.setInt(1, funcionario.getMatricula());
			stmt.setString(2, funcionario.getNome());
			stmt.setInt(3, funcionario.getCargo());
			stmt.setDate(4, funcionario.getDataAdmissao());
			stmt.setBigDecimal(5, funcionario.getVrGastoValeTransporte());
			stmt.setBoolean(6, funcionario.isOpCestaBasica());
			stmt.setInt(7, funcionario.getNumDependentes());
			
			rc = stmt.executeUpdate();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			msg = e.getMessage();
		}
		return rc;
	}

	@Override
	public int excluir(FuncionarioTO funcionario) {
		PreparedStatement stmt;
		int rc = 0;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmtExcluirFuncionario);
			stmt.setInt(1, funcionario.getMatricula());
			rc = stmt.executeUpdate();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			msg = e.getMessage();
		}
		return rc;
	}

	public String getMessage() {
		return msg;
	}

	@Override
	public int alterar(FuncionarioTO funcionario) {
		PreparedStatement stmt;
		int rc = 0;
		try {
			stmt = DAOFactory.criaConexao().prepareStatement(stmntAlterarFuncionario);
			
			stmt.setInt(1, funcionario.getMatricula());
			stmt.setString(2, funcionario.getNome());
			stmt.setInt(3, funcionario.getCargo());
			stmt.setDate(4, funcionario.getDataAdmissao());
			stmt.setBigDecimal(5, funcionario.getVrGastoValeTransporte());
			stmt.setBoolean(6, funcionario.isOpCestaBasica());
			stmt.setInt(7, funcionario.getNumDependentes());
			stmt.setInt(8, funcionario.getMatricula());
			
			rc = stmt.executeUpdate();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			msg = e.getMessage();
		}
		return rc;
	}
}
